import numpy as np
import matplotlib.pyplot as plt

# 读取训练数据,command+option+c复制完整路径
path = 'E:\Learning_Notes\Maths_about_ML\sourcecode-cn\images1.csv'
train = np.loadtxt(path, delimiter=',', skiprows=1)
train_x = train[:,0:2]
train_y = train[:,2]

# 权重的初始化
w = np.random.rand(2)

# 判别函数
def f(x):
    if np.dot(w, x) >= 0:
        return 1
    else:
        return -1

# 重复次数
epoch = 10

# 更新次数
count = 0

# 学习权重
# 1. 外层循环：控制训练轮次，整个训练集要重复训练 epoch 遍
for _ in range(epoch):
    # 2. 内层循环：遍历训练集中的每一个样本（x=特征，y=真实标签）
    # zip(train_x, train_y)：把特征和对应标签配对（比如第1个x配第1个y，第2个x配第2个y）
    for x, y in zip(train_x, train_y):
    # 3. 核心判断：如果模型预测结果 f(x) 不等于真实标签 y → 预测错误    
        if f(x) != y:
        # 4. 参数更新：调整模型权重 w（这里是朴素更新规则，非标准梯度下降）    
            w = w + y * x
            # 5. 记录更新次数：每错一次，count 加1
            # 输出日志
            count +=1
            # 6. 输出日志：打印第几次更新，以及当前的 w 值
            print('第{}次: w = {}'.format(count, w))
x1 = np.arange(0, 500)

# 绘图
plt.plot(train_x[train_y ==  1, 0], train_x[train_y == 1, 1], 'o')
plt.plot(train_x[train_y ==  -1, 0], train_x[train_y == -1, 1], 'x')
plt.plot(x1, -w[0] / w[1] * x1, linestyle='dashed')
plt.show()
